import os.path
import unittest
from unittest.mock import patch, Mock
from ascend_deployer.downloader.download_util import get_remote_content_length, get_obs_downloader_path


class TestGetRemoteContentLength(unittest.TestCase):

    @patch('urllib.request.Request')
    @patch('urllib.request.urlopen')
    def test_get_remote_content_length_success(self, mock_urlopen, mock_request):
        mock_response = Mock()
        mock_response.getheader.return_value = '"12345"'
        mock_urlopen.return_value.__enter__.return_value = mock_response

        result = get_remote_content_length('http://example.com')
        self.assertEqual(result, 12345)

    @patch('urllib.request.Request')
    @patch('urllib.request.urlopen')
    def test_get_remote_content_length_no_header(self, mock_urlopen, mock_request):
        mock_response = Mock()
        mock_response.getheader.return_value = ''
        mock_urlopen.return_value.__enter__.return_value = mock_response

        result = get_remote_content_length('http://example.com')
        self.assertIsNone(result)

    @patch('urllib.request.Request')
    @patch('urllib.request.urlopen')
    def test_get_remote_content_length_invalid_header(self, mock_urlopen, mock_request):
        mock_response = Mock()
        mock_response.getheader.return_value = '"not_a_number"'
        mock_urlopen.return_value.__enter__.return_value = mock_response

        result = get_remote_content_length('http://example.com')
        self.assertIsNone(result)

    @patch('urllib.request.Request')
    @patch('urllib.request.urlopen')
    def test_get_remote_content_length_exception(self, mock_urlopen, mock_request):
        mock_urlopen.side_effect = Exception('Test exception')

        result = get_remote_content_length('http://example.com')
        self.assertIsNone(result)


class TestGetObsDownloaderPath(unittest.TestCase):

    @patch('os.path.exists')
    def test_get_obs_downloader_path_exists(self, mock_exists):
        mock_exists.return_value = True
        original_path = '/path/to/downloader'
        expected_path = '/path/to/downloader/obs_downloader_config'
        self.assertEqual(get_obs_downloader_path(original_path), os.path.normpath(expected_path))

    @patch('os.path.exists')
    def test_get_obs_downloader_path_not_exists(self, mock_exists):
        mock_exists.return_value = False
        original_path = '/path/to/downloader'
        self.assertEqual(get_obs_downloader_path(original_path), original_path)

    def test_get_obs_downloader_path_no_downloader(self):
        original_path = '/path/to/somewhere'
        self.assertEqual(get_obs_downloader_path(original_path), original_path)


if __name__ == '__main__':
    unittest.main()
